package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"

	"gitee.com/jnshao/go-start/basic/functional/fib"
)

// 定义别名，封装成类型，斐波那契数列生成器
// 相当于定义委托类型
type intGen func() int

// 实现io.Reader接口
func (g intGen) Read(
	p []byte) (n int, err error) {
	next := g() //获取下一个元素
	if next > 10000 {
		return 0, io.EOF
	}

	//将next写进p中，使用已经实现Read方法进行代理，先转成字符串
	s := fmt.Sprintf("%d\n", next)
	// TODO: incorrect if p is too small!
	//将s写进p中
	return strings.NewReader(s).Read(p)
}

// 打印斐波那契数列内容值  <10000
func printFileContents(reader io.Reader) {
	scanner := bufio.NewScanner(reader)

	for scanner.Scan() { //获取下一个元素,每次调用下Read方法
		fmt.Println(scanner.Text())
	}
}

func main() {
	var f intGen = fib.Fibonacci()
	// for i := 0; i < 10; i++ {
	// 	fmt.Printf("%d\n", f())
	// }
	printFileContents(f)
}
